home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / usr (gcc 1.37 libs) / mac / read.c < prev    next >
C/C++ Source or Header  |  1993-12-08  |  1KB  |  50 lines

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. #include "crtlocal.h"
  5.  
  6. ssize_t read(int fd, void *buf, size_t size)
  7.     {
  8.     if (crt_fd_tab[fd].fd==0)    /* stdin */
  9.         {
  10.         int wait = 1;
  11.         int cnt = 0;
  12.         while ((cnt < size) && wait)
  13.             {
  14.             int ch = cgetc();
  15.             char c = ch;
  16.             switch(ch)
  17.                 {
  18.                 case EOF: return EOF; break;
  19.                 case '\b': if (cnt >0) cnt--; break;
  20.                 case '\r': ch = '\n';
  21.                 case '\n': wait = 0;
  22.                 default: ((char *)buf)[cnt++] = ch; break;
  23.                 }
  24.             cwrite(0, &c, 1);
  25.             }
  26.         return cnt;
  27.         }
  28.     else if (crt_fd_tab[fd].flags & O_PIPE)
  29.         {
  30.         return readpipe(fd, buf, size);
  31.         }
  32.     else
  33.         {
  34.         int i;
  35.         OSErr err;
  36.         IOParam pb;
  37.         pb.ioCompletion = 0;
  38.         pb.ioRefNum = crt_fd_tab[fd].fd;
  39.         pb.ioBuffer = buf;
  40.         pb.ioReqCount = size;
  41.         pb.ioPosMode = fsAtMark;
  42.         PBReadSync((ParmBlkPtr)&pb);
  43.         err = pb.ioResult;
  44.         if (crt_fd_tab[fd].flags & O_TEXT)
  45.             for (i = pb.ioActCount; i--; ) if (((char *)buf)[i] == '\r') ((char *)buf)[i] = '\n';
  46.         mysleep(1);
  47.         return pb.ioActCount;
  48.         }
  49.     }
  50.